﻿namespace DotNetStar.OpenSDK
{
    using QQ;
    using System.Threading.Tasks;

    /// <summary>
    /// QQ 互联 扩展。
    /// </summary>
    public static class QQConnectionExtensions
    {
        /// <summary>
        /// QQ 互联。
        /// </summary>
        /// <param name="skd">The open API.</param>
        /// <returns></returns>
        public static QQConnectionPlatform QQConnect(this SDK skd)
        => skd.GetOpenPlatform<QQConnectionPlatform>();

        /// <summary>
        /// 生成申请授权码 url 链接地址。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="request">授权认证的 api 请求。</param>
        /// <returns>一个可以申请 QQ登录的 url 地址字符串。</returns>
        public static string GenerateAuthorizeCodeUrl(this QQConnectionPlatform qq, QQAuthorizeCodeApiRequest request)
        {
            if (request == null)
            {
                throw new System.ArgumentNullException(nameof(request));
            }
            return string.Concat(request.RequestUrl,"?",request.GetArguments().ToString());
        }

        /// <summary>
        /// 以异步的方式获取令牌凭据。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="config">OAuth2.0 认证配置。</param>
        /// <param name="code">授权码。</param>
        /// <returns>这是一个任务，在任务完成后获得 <see cref="QQOAuthApiResponse"/> 的结果。</returns>
        public static Task<QQOAuthApiResponse> GetAccessTokenAsync(this QQConnectionPlatform qq, OAuth.OAuthConfig config, string code)
        {
            if (config == null)
            {
                throw new System.ArgumentNullException(nameof(config));
            }

            return ApiClient.ExecuteAsync(new QQAccessTokenApiRequest(config, code));
        }

        /// <summary>
        /// 以异步的方式获取 OpenId。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="accessToken">令牌凭据。</param>
        /// <returns>这是一个任务，在任务完成后获得 <see cref="QQOpenIdApiResponse"/> 的结果。</returns>
        public static Task<QQOpenIdApiResponse> GetOpenIdAsync(this QQConnectionPlatform qq, string accessToken)
            => ApiClient.ExecuteAsync(new QQOpenIdApiRequest(accessToken));

        /// <summary>
        /// 以异步的方式获取登录用户在QQ空间的信息，包括昵称、头像、性别及黄钻信息（包括黄钻等级、是否年费黄钻等）。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="config">可访问 QQ api 的配置。</param>
        /// <returns>这是一个任务，在任务完成后获得 <see cref="QQUserInfoApiResponse"/> 的结果。</returns>
        public static Task<QQUserInfoApiResponse> GetUserInfoAsync(this QQConnectionPlatform qq, QQApiConfig config)
        {
            if (config == null)
            {
                throw new System.ArgumentNullException(nameof(config));
            }

            return ApiClient.ExecuteAsync(new QQUserInfoApiRequest(config));
        }

        /// <summary>
        /// 以异步的方式获取 QQ 会员的基本信息。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="config">可访问 QQ api 的配置。</param>
        /// <returns>这是一个任务，在任务完成后获得 <see cref="QQVipInfoApiResponse"/> 的结果。</returns>
        public static Task<QQVipInfoApiResponse> GetVipInfoAsync(this QQConnectionPlatform qq, QQApiConfig config)
        {
            if (config == null)
            {
                throw new System.ArgumentNullException(nameof(config));
            }
            return ApiClient.ExecuteAsync(new QQVipInfoApiRequest(config));
        }

        /// <summary>
        /// 以异步的方式获取 QQ 会员的高级信息。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="config">可访问 QQ api 的配置。</param>
        /// <returns>这是一个任务，在任务完成后获得 <see cref="QQVipRichInfoApiResponse"/> 的结果。</returns>
        public static Task<QQVipRichInfoApiResponse> GetVipRichInfoAsync(this QQConnectionPlatform qq, QQApiConfig config)
        {
            if (config == null)
            {
                throw new System.ArgumentNullException(nameof(config));
            }
            return ApiClient.ExecuteAsync(new QQVipRichInfoApiRequest(config));
        }


        /// <summary>
        /// 以异步的方式获取 QQ 空间的相册列表。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="config">可访问 QQ api 的配置。</param>
        /// <returns>这是一个任务，在任务完成后获得 <see cref="QQAlbumListApiResponse"/> 的结果。</returns>
        public static Task<QQAlbumListApiResponse> GetAlbumListAsync(this QQConnectionPlatform qq, QQApiConfig config)
        {
            if (config == null)
            {
                throw new System.ArgumentNullException(nameof(config));
            }
            return ApiClient.ExecuteAsync(new QQAlbumListApiRequest(config));
        }


        /// <summary>
        /// 以异步的方式获取 QQ 空间指定相册的照片集合。
        /// </summary>
        /// <param name="qq">《QQ互联》开放平台的扩展实例。</param>
        /// <param name="request">相册 api 请求。</param>
        /// <returns>这是一个任务，在任务完成后获得 <see cref="QQAlbumPhotoApiResponse"/> 的结果。</returns>
        public static Task<QQAlbumPhotoApiResponse> GetAlbumPhotoListAsync(this QQConnectionPlatform qq, QQAlbumPhotoApiRequest request)
        {
            if (request == null)
            {
                throw new System.ArgumentNullException(nameof(request));
            }
            return ApiClient.ExecuteAsync(request);
        }
    }
}
